home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Samples / SampleCode / Tumbler and Podium / Tumbler_PICTImport.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-08  |  4.9 KB  |  181 lines  |  [TEXT/MPS ]

  1. #include "Tumbler_globals.h"
  2. #include "Tumbler_prototypes.h"
  3. #include "QD3DShader.h"
  4. #include "QD3DStorage.h"
  5.  
  6. #include "Tumbler_PICTImport.h"
  7.  
  8.  
  9. TQ3Boolean TextureFromPICT(
  10.     PicHandle             pict,
  11.     TQ3StoragePixmap     *bmap)
  12. {
  13.     unsigned long             *texture_map;
  14.     unsigned char             *texture_map_addr;
  15.     unsigned long             *pict_map;
  16.     unsigned long             pict_map_addr;
  17.     register unsigned long     row;
  18.     register unsigned long     col;
  19.     Rect                     rectGW;
  20.     GWorldPtr                 pGWorld;
  21.     PixMapHandle             hPixMap;
  22.     unsigned long             pict_rowbytes;
  23.     
  24.     GDHandle                oldGD;
  25.     GWorldPtr                oldGW;
  26.     
  27.     unsigned long            textureSize;
  28.     
  29.     /* save current port */
  30.     GetGWorld(&oldGW, &oldGD);
  31.  
  32.     rectGW = (*pict)->picFrame;
  33.     
  34.     /* create the GWorld */
  35.     if(NewGWorld(&pGWorld, 32, &rectGW, 0, 0, 0) != noErr) {
  36.         Alert(130, 0L);
  37.         return(kQ3False);
  38.     }
  39.     
  40.     
  41.     if(pGWorld == nil) {
  42.         Alert(130, 0L);
  43.         return(kQ3False);
  44.     }
  45.  
  46.     hPixMap = GetGWorldPixMap(pGWorld);
  47.     pict_map_addr = (unsigned long) GetPixBaseAddr (hPixMap);
  48.     pict_rowbytes = (unsigned long)(**hPixMap).rowBytes & 0x3fff;
  49.     
  50.     /* put the PICT into the window */
  51.     SetGWorld(pGWorld, nil);
  52.     
  53.     LockPixels(hPixMap);
  54.     EraseRect(&rectGW);
  55.     DrawPicture(pict, &rectGW);
  56.         
  57.     /* allocate an area of memory for the texture */
  58.  
  59.     textureSize = (rectGW.right - rectGW.left) * (rectGW.bottom - rectGW.top) * sizeof(unsigned long);
  60.  
  61.     texture_map = (unsigned long *)NewPtr(textureSize);
  62.     if (texture_map == nil) {
  63.         Alert(130, 0L);
  64.         return(kQ3False);
  65.     }
  66.     
  67.     bmap->width = rectGW.right - rectGW.left;
  68.     bmap->height = rectGW.bottom - rectGW.top;
  69.     bmap->rowBytes = bmap->width * 4;
  70.     bmap->pixelSize = 32;
  71.     bmap->pixelType = kQ3PixelTypeRGB32;
  72.     bmap->bitOrder = kQ3EndianBig ;
  73.     bmap->byteOrder = kQ3EndianBig ;
  74.  
  75.     /* copy the PICT into the texture */
  76.     texture_map_addr = (unsigned char *) texture_map;
  77.     for (row = 0L; row < bmap->height; row++) {
  78.         pict_map = (unsigned long *)(pict_map_addr + (pict_rowbytes * row));
  79.         for (col = 0L; col < bmap->width; col++) {
  80.             *texture_map++ = (*pict_map++|0xff000000L);
  81.         }
  82.     }
  83.     
  84.     bmap->image = Q3MemoryStorage_New(texture_map_addr, textureSize);
  85.  
  86.     UnlockPixels(hPixMap);
  87.     
  88.     /* restore port */
  89.     SetGWorld(oldGW, oldGD);
  90.     
  91.     /* free GWorld */
  92.     DisposeGWorld(pGWorld);
  93.     
  94.     DisposePtr((Ptr)texture_map_addr);
  95.     
  96.     return(kQ3True);
  97. }
  98.  
  99. TQ3Status AddTextureToDocument(DocumentPtr theDocument, TQ3StoragePixmap *textureImage)
  100. {
  101.     TQ3TextureObject    textureObject;
  102.     TQ3GroupPosition position;
  103.     TQ3Object        firstObject;
  104.     
  105.     textureObject = Q3PixmapTexture_New(textureImage);
  106.     
  107.     if( textureObject ) {
  108.         if( Q3Object_IsType(theDocument->documentGroup, kQ3GroupTypeDisplay) == kQ3True) {
  109.             Q3Group_GetFirstPosition(theDocument->documentGroup, &position);
  110.     
  111.             Q3Group_GetPositionObject(theDocument->documentGroup, position,    &firstObject);
  112.     
  113.             if( Q3Object_IsType(firstObject, kQ3SurfaceShaderTypeTexture) == kQ3True) {
  114.                 TQ3TextureObject    oldTextureObject;
  115.                 TQ3StoragePixmap oldTextureImage;
  116.                         
  117.                 Q3TextureShader_GetTexture(firstObject, &oldTextureObject);
  118.                 Q3PixmapTexture_GetPixmap(oldTextureObject, &oldTextureImage);
  119.                 
  120.                 Q3Object_Dispose(oldTextureObject);
  121.                 Q3TextureShader_SetTexture(firstObject, textureObject);
  122.                 Q3Object_Dispose(textureObject);
  123.             } else {
  124.                 TQ3ShaderObject textureShader;
  125.                 
  126.                 textureShader = Q3TextureShader_New(textureObject);
  127.                 Q3Object_Dispose(textureObject);
  128.                 //Q3Group_SetPositionObject(theDocument->documentGroup, position, theDocument->textureShader);
  129.                 Q3Group_AddObjectBefore(theDocument->documentGroup, position, textureShader);
  130.                 Q3Object_Dispose(textureShader);
  131.             }
  132.             
  133.             Q3Object_Dispose(firstObject);
  134.         } else if( Q3Object_IsType(theDocument->documentGroup, kQ3DisplayGroupTypeOrdered) == kQ3True) {
  135.             TQ3ShaderObject textureShader;
  136.             
  137.             Q3Group_GetFirstPositionOfType(
  138.                 theDocument->documentGroup,
  139.                 kQ3ShapeTypeShader, &position);    
  140.             
  141.             if( position ) {
  142.                 Q3Group_GetPositionObject(theDocument->documentGroup, position,    &firstObject);
  143.     
  144.                 if( Q3Object_IsType(firstObject, kQ3SurfaceShaderTypeTexture) == kQ3True) {
  145.                     TQ3TextureObject    oldTextureObject;
  146.                     TQ3StoragePixmap oldTextureImage;
  147.                     
  148.                     Q3TextureShader_GetTexture(firstObject, &oldTextureObject);
  149.                     Q3PixmapTexture_GetPixmap(oldTextureObject, &oldTextureImage);
  150.                     
  151.                     Q3Object_Dispose(oldTextureObject);
  152.                     Q3TextureShader_SetTexture(firstObject, textureObject);
  153.                     Q3Object_Dispose(textureObject);
  154.                 } else {
  155.                     textureShader = Q3TextureShader_New(textureObject);
  156.                     if( textureShader ) {
  157.                         Q3Object_Dispose(textureObject);
  158.                         Q3Group_SetPositionObject(theDocument->documentGroup, position, textureShader);
  159.                         Q3Object_Dispose(textureShader);
  160.                     } else {
  161.                         return(kQ3Failure);
  162.                     }
  163.                 }
  164.             } else {
  165.                 textureShader = Q3TextureShader_New(textureObject);
  166.                 if( textureShader ) {
  167.                     Q3Object_Dispose(textureObject);
  168.                     Q3Group_AddObject(theDocument->documentGroup, textureShader);
  169.                     Q3Object_Dispose(textureShader);
  170.                 } else {
  171.                     return(kQ3Failure);
  172.                 }
  173.             }
  174.             
  175.         }
  176.     return(kQ3Success);
  177.     } else {
  178.         return(kQ3Failure);
  179.     }
  180. }
  181.